From a9d1b6adb4e47ae89d55274ff3f7121122e15975 Mon Sep 17 00:00:00 2001
From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Date: Thu, 1 Aug 2019 17:42:16 +0200
Subject: [PATCH] Make binutils optional

Add an option to enable or disable bfd support to allow the user to use
dropwatch without binutils

Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
[Upstream status: https://github.com/nhorman/dropwatch/pull/10]
---
 configure.ac     | 10 ++++++++++
 src/Makefile.am  |  9 +++++++--
 src/lookup.c     |  8 ++++++++
 src/lookup.h     |  4 ++++
 src/lookup_kas.c |  1 -
 5 files changed, 29 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index 97e21fe..c01a9f4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,6 +17,15 @@ PKG_CHECK_MODULES([LIBNL3], [libnl-3.0], [], [AC_MSG_ERROR([libnl-3.0 is require
 # Fallback on using -lreadline as readline.pc is only available since version 8.0
 PKG_CHECK_MODULES([READLINE], [readline], [], [READLINE_LIBS=-lreadline])
 
+AC_ARG_WITH([bfd],
+	[AS_HELP_STRING([--without-bfd], [Build without bfd library (default: yes)])],
+	[with_bfd=$withval],
+	[with_bfd=yes])
+AS_IF([test "x$with_bfd" != "xno"], [
+	AC_CHECK_HEADERS([bfd.h], [], [AC_MSG_ERROR([Couldn't find or include bfd.h])])
+])
+AM_CONDITIONAL(USE_BFD, test "x$with_bfd" != "xno")
+
 AC_OUTPUT(Makefile src/Makefile doc/Makefile tests/Makefile)
 
 AC_MSG_NOTICE()
@@ -25,3 +34,4 @@ AC_MSG_NOTICE([Target:                 $target])
 AC_MSG_NOTICE([Installation prefix:    $prefix])
 AC_MSG_NOTICE([Compiler:               $CC])
 AC_MSG_NOTICE([Compiler flags: $CFLAGS])
+AC_MSG_NOTICE([BFD library support: $with_bfd])
diff --git a/src/Makefile.am b/src/Makefile.am
index 16db0b4..994fbd8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -2,7 +2,12 @@
 bin_PROGRAMS = dropwatch
 
 AM_CFLAGS = -g -Wall -Werror $(LIBNL3_CFLAGS) $(READLINE_CFLAGS)
-AM_LDFLAGS = $(LIBNL3_LIBS) -lnl-genl-3 -lbfd $(READLINE_LIBS)
+AM_LDFLAGS = $(LIBNL3_LIBS) -lnl-genl-3 $(READLINE_LIBS)
 AM_CPPFLAGS = -D_GNU_SOURCE
 
-dropwatch_SOURCES = main.c lookup_bfd.c lookup.c lookup_kas.c
+dropwatch_SOURCES = main.c lookup.c lookup_kas.c
+
+if USE_BFD
+dropwatch_SOURCES += lookup_bfd.c
+AM_LDFLAGS += -lbfd
+endif
diff --git a/src/lookup.c b/src/lookup.c
index 521e292..ec5e847 100644
--- a/src/lookup.c
+++ b/src/lookup.c
@@ -30,7 +30,9 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <sys/utsname.h>
+#ifdef HAVE_BFD_H
 #include <bfd.h>
+#endif
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
@@ -38,7 +40,9 @@
 
 #include "lookup.h"
 
+#ifdef HAVE_BFD_H
 extern struct lookup_methods bfd_methods;
+#endif
 extern struct lookup_methods kallsym_methods;
 
 static int lookup_null_init(void)
@@ -75,17 +79,21 @@ int init_lookup(lookup_init_method_t method)
 		methods = &null_methods;
 		break;
 	case METHOD_AUTO:
+#ifdef HAVE_BFD_H
 		methods = &bfd_methods;
 		if (methods->lookup_init() == 0)
 			return 0;
+#endif
 		methods = &kallsym_methods;
 		if (methods->lookup_init() == 0)
 			return 0;
 		methods = NULL;
 		return -1;
+#ifdef HAVE_BFD_H
 	case METHOD_DEBUGINFO:
 		methods = &bfd_methods;
 		break;
+#endif
 	case METHOD_KALLSYMS:
 		methods = &kallsym_methods;
 		break;
diff --git a/src/lookup.h b/src/lookup.h
index e6568d8..2c56a92 100644
--- a/src/lookup.h
+++ b/src/lookup.h
@@ -25,6 +25,8 @@
  * 2) /proc/kallsyms
  */
 
+#include "config.h"
+
 #include <stdlib.h>
 #include <asm/types.h>
 
@@ -44,7 +46,9 @@
 typedef enum {
 	METHOD_NULL = 0,
 	METHOD_AUTO,
+#ifdef HAVE_BFD_H
 	METHOD_DEBUGINFO,
+#endif
 	METHOD_KALLSYMS
 } lookup_init_method_t;
 
diff --git a/src/lookup_kas.c b/src/lookup_kas.c
index 2300220..9a1a148 100644
--- a/src/lookup_kas.c
+++ b/src/lookup_kas.c
@@ -28,7 +28,6 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <sys/utsname.h>
-#include <bfd.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
-- 
2.20.1

